<?php
/**
* 名称：用户模型。
* 描述：提供"用户概念"的"程序逻辑"封装和"模型定义数据"。
*/
final class Model_Account{
    /**
    * 描述：加密公钥。
    */
    const SAFEKEY='CC1065C3-6740-BBA0-DEE1-2AE39D055C02';

    /**
    * 描述：用户cookie名称，统一进行cookie资源调用和管理。
    */
    const COOKIE_PATH='/';
    const COOKIE_DOMAIN=NULL;
    const COOKIE_EXPIRE=2592000; //记住密码，30天的时间。
    const COOKIE_USERNAME='admin_x4_username_1EA4B87D-AFD6-89D8-FDBC-8AFA7E184402';
    const COOKIE_PASSWORD='admin_x4_password_1EA4B87D-AFD6-89D8-FDBC-8AFA7E184402';
    const COOKIE_SYSTEM='admin_x4_license_1EA4B87D-AFD6-89D8-FDBC-8AFA7E184402';

    /**
    * 描述：验证给出的用户信息与数据库信息是否一致，来确定是不是正确的用户。
    * @param  string  $username optional 用户名。
    * @param  string  $password optional hash后的密码。
    * @return boolean
    */
    private static function Is($username=NULL,$password=NULL){
        #获取当前用户登录信息。
        list($username,$password)=array($username,$password);
        #检测是否为空，为空则则返回FALSE。
        if(empty($username)||empty($password)){
            return FALSE;
        }
        #验证信息是否与数据库信息一致。
        $data=Database::GetRowByValue('_management_account','Username',$username);
        if(empty($data)||$data['Password']!=$password){
            return FALSE;
        }
        return TRUE;
    }

    /**
    * 描述：检测当前用户是不是己经登录，检测给出的用户是不是有登录的权限。
    * @return boolean
    */
    public static function IsLogin(){
        return self::Is(Cookie::Get(self::COOKIE_USERNAME),Cookie::Get(self::COOKIE_PASSWORD));
    }

    /**
    * 描述：检测给出的用户数据是不是正确的用户。
    * @param  string  $username require 用户名。
    * @param  string  $password require hash后的密码。
    * @return boolean
    */
    public static function IsRightUser($username,$password){
        return self::Is($username,$password);
    }

    /**
    * 描述：根据获取到的信息，登录到系统。
    * @param  string  $username   require 用户名。
    * @param  string  $password   require hash后的密码。
    * @param  string  $isRemember require 是否记住密码。
    * @return boolean
    */
    public static function Login($username,$password,$system,$isRemember){
        #记录登录信息
        $cookieExpire=NULL;
        if($isRemember){
            $cookieExpire=time()+self::COOKIE_EXPIRE;
        }
        Database::ExecParameterized('update _management_account set LoginDatetime=?,LoginCount=LoginCount+1 where Username=?',array(
            date('Y-m-d G:i:s'),
            $username
        ));
        #写入登录cookie
        Cookie::Set(self::COOKIE_USERNAME,$username,$cookieExpire,self::COOKIE_PATH,self::COOKIE_DOMAIN);
        Cookie::Set(self::COOKIE_PASSWORD,$password,$cookieExpire,self::COOKIE_PATH,self::COOKIE_DOMAIN);
        Cookie::Set(self::COOKIE_SYSTEM,$system,$cookieExpire,self::COOKIE_PATH,self::COOKIE_DOMAIN);
        return TRUE;
    }

    /**
    * 描述：判断用户是否拥有某授权。
    * @param  string $username require 用户名。
    * @return void
    */
    public static function IsLicense($license,$username=NULL){
        #如果没有给出用户标识，那就默认为当前登录用户。
        if(is_null($username)){
            $username=Cookie::Get(Model_Account::COOKIE_USERNAME);
        }
        #获取用户授权证书信息。
        $data=Database::GetRows('select * from _management_account_license where Username=? and License=? limit 0,1',array(
            $username,
            $license
        ));
        if($data){
            return TRUE;
        }
        else{
            $data=Database::GetRows('select * from _management_account_license where Username=? and License=? limit 0,1',array(
                $username,
                Model_License::$SYSTEM0['Value']
            ));
            if($data){
               return TRUE;
            }
            return FALSE;
        }
    }

    /**
    * 描述：登出、注销、退出系统，删除cookie信息。
    * @return void
    */
    public static function Logout(){
        Cookie::Delete(self::COOKIE_USERNAME,self::COOKIE_PATH,self::COOKIE_DOMAIN);
        Cookie::Delete(self::COOKIE_PASSWORD,self::COOKIE_PATH,self::COOKIE_DOMAIN);
    }

    /**
    * 描述：使用加蜜算法混淆用户相关的信息，如密码等。
    * @param  string $string require 要加密的字符串。
    * @return string
    */
    public static function Hash($string){
        return strtoupper(md5($string.self::SAFEKEY));
    }

    /**
    * 描述：检测用户是不是具有给出的权限，如username参数为空，就是当前会话用户，如果不为空就是指定的用户。
    * @param  mix    $permission require  给定的用户权限值。
    * @param  string $username   optional 指定用户的用户名。
    * @return boolean
    */
    public static function IsHavePermission($permission,$username=NULL){
        if(empty($username)){
            $username=Cookie::Get(self::COOKIE_USERNAME);
        }
        $permission=(string)$permission;
        $accountData=Database::GetRowByValue('_management_account','Username',$username);
        #检测是不是超级管理员。
        if($accountData['RoleID']==Model_Permission::ADMINISTRATOR){
            return TRUE;
        }
        else{
            #检测用户权限是"角色型",还是"分散权限型"，验证其权限。
            if(empty($accountData['Permission'])){
                $roleData=Database::GetRowByValue('_management_permission_role','ID',$accountData['RoleID']);
                return $roleData==NULL ? FALSE:in_array($permission,explode('|',$roleData['Permission']));
            }
            else{
                return in_array($permission,explode('|',$accountData['Permission']));
            }
        }
    }
}
?>